  /**
     * CODE
     * @author amamatthew / @xm
     * @log 0.1 finish CODEtoHTML
      var res = parser.CodePrase("<font>{text = '窗', color = '255,0,0', font_size = 20}</font><font>{text = '窗', color = '255,255,0', font_size = 20}</font>之前明<br>月光吗？");
      console.log(res); //<span style="font-size:20px;color:rgb(255,0,0)";>窗</span><span style="font-size:20px;color:rgb(255,255,0)";>窗</span>之前明<br>月光吗？
     */
  var CODE = (function() {

      Util = {
          /**
           * 小写字符、删除空格、替换双引号
           * @param {str} string object
           * @return {str} string object
           */
          formatTag: function(str) {
              str = str.rtrim(); //删右侧空格
              str = str.toLowerCase(); //小写字符
              return str.replace(/\'/g, '\"'); //单引换双引
          },

          /**
           * 删除<font>标记
           * @param {str} string object
           * @return {str} string object
           */
          delFontTag: function(str) {
              var temp = str.replace(/<font>/g, ""); //删除<font>
              return temp.replace(/<\/font>/g, ""); //删除<font>
          },

          /**
           * 获取颜色/字体大小及文字
           * @param {str} string object
           * @return {str} string object
           */
          getTextTag: function(content) {

              var result,
                  rtn = [],
                  contents = [];

              const regText = /text=\"(.*?)\"/g; //查找文本
              const regColor = /color=\"(.*?)\"/g; //查找颜色
              const regFontsize = /font_size=(\d{1,2})/g; //查找字体

              //匹配所有大括号字符串
              if ((result = regText.exec(content)) != null) {
                  rtn['text'] = result[1];
              }

              if ((result = regColor.exec(content)) != null) {
                  rtn['color'] = result[1];
              }

              if ((result = regFontsize.exec(content)) != null) {
                  rtn['font_size'] = result[1];
              }
              return rtn;
          },

          /**
           * 获取颜色/字体大小及文字
           * @param {str} string object
           * @return {str} string object
           */
          mergeTag: function(arr) {
              var str;
              var word = arr.hasOwnProperty('text') ? arr['text'] : '';
              var color = arr.hasOwnProperty('color') ? arr['color'] : null;
              var font_size = arr.hasOwnProperty('font_size') ? arr['font_size'] : null;

              if ('' != word) {

                  str = '<span style="';

                  if (null != font_size) {
                      str += "font-size:" + font_size + "px;";
                  }

                  if (null != color) {
                      str += "color:rgb(" + color + ")" + '";';
                  } else {
                      str += '"';
                  }
                  str += ">" + word + "</span>";
              }
              return (str);
          },

          /**
           * parse str text into html text
           * @param {object} node
           * @param {object} setting
           * @param {object} state
           * @return {string} html text
           */
          parseCode: function(str) {
              const reg = /\{(.*?)\}/g; //查找{}内匹配内容
              var res = str.replace(reg,
                  function(word) {
                      var temp = word.replace(/\s/g, ""); //去除空格
                      var arr = Util.getTextTag(temp);
                      return Util.mergeTag(arr);
                  }
              );
              return res;
          },

          /**
           * 删除文字右侧空格及Html标记
           * @param {str} string object
           * @return {str} string object
           */
          delHtmlTag: function(str) {
              var _str = str.rtrim(); //删右侧空格
              var temp = _str.replace(/<[^>]+>/g, "");
              //temp = temp.replace(/ /g,"");
              return temp;
          },

          /**
           * 判断是否存在中文特殊字符{单双引号}
           * @param {str} string object
           * @return {str} string object
           */
          hasChineseQuotation: function(str) {
              return (str.search(/(‘|’)/g) >= 0 || str.search(/(“|”)/g) >= 0) ? true : false;
          },

          /**
           * HTML格式字符转换
           * @param {str} string object
           * @return {str} string object
           */
          countCode: function(str) {
              var res = Util.formatTag(str);
              res = Util.delFontTag(res); //删除<font>标签
              res = Util.parseCode(res); //解析
              res = Util.delHtmlTag(res);
              return res.length;
          }
      };
      /**
       *  var parser = new CODE();
       *  @return {object}
       */
      function CODE() {}

      /**
       * @param {string} CODE text
       * @return {string} html text
       */
      CODE.prototype.CodePrase = function(str) {

          if (Util.hasChineseQuotation(str)) {

              alert('提示：文字/代码中发现中文引号！');
          }
          var res = Util.formatTag(str);
          res = Util.delFontTag(res); //删除<font>标签
          res = Util.parseCode(res); //解析
          return res;
      };

      /**
       * @param {string} CODE text
       * @return {string} html text
       */
      CODE.prototype.CountCharWithoutStyle = function(str) {

          return Util.countCode(str);
      };

      return CODE;
  })();